package 创建型模式.抽象工厂模式;

//	结构组成
//		抽象工厂(AbstractFactory)：声明创建抽象产品对象的接口
//		具体工厂(ConcreteFactory)：实现创建具体产品对象的操作
//		抽象产品(AbstractProduct)：声明一类产品对象的接口
//		具体产品(ConcreteProduct)：定义具体工厂创建的具体产品对象
//		客户端(Client)：仅使用由抽象工厂和抽象产品类声明的接口

interface ProductA
{
	void use();	
}

class Phone implements ProductA
{
	@Override
	public void use() {
		System.out.println("使用手机");
	}
}

class TV implements ProductA
{
	@Override
	public void use() {
		System.out.println("使用电视");
	}
}

interface ProductB
{
	void open();
}

class Fridge implements ProductB
{
	@Override
	public void open() {
		System.out.println("打开冰箱");
	}
}

class Case implements ProductB
{
	@Override
	public void open() {
		System.out.println("打开盒子");
	}
}

//抽象工厂
abstract class Factory
{
	//抽象方法
	abstract ProductA getA();
	abstract ProductB getB();
}

//工厂A
class FactoryA extends Factory
{

	@Override
	ProductA getA() {
		return new Phone();
	}

	@Override
	ProductB getB() {
		return new Fridge();
	}
}

//工厂B
class FactoryB extends Factory {

	@Override
	ProductA getA() {
		return new TV();
	}

	@Override
	ProductB getB() {
		return new Case();
	}
}

public class AbstractFactoryPattern 
{
	public static void main(String[] args) {
		//工厂A
		FactoryA factoryA = new FactoryA();
		factoryA.getA().use();
		factoryA.getB().open();
		
		//工厂B
		FactoryB factoryB = new FactoryB();
		factoryB.getA().use();
		factoryB.getB().open();
	}
}
